/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.folha.service;

import br.com.folha.dao.TurmaDao;
import br.com.folha.dao.unidadeTipologiaDao;
import br.com.folha.entity.Professor;
import br.com.folha.entity.ProfessorUnidadeTipologia;
import br.com.folha.entity.Turma;
import br.com.folha.entity.Unidade;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.NoResultException;

/**
 *
 * @author marceloml
 */
public class FolhaService implements Serializable{
    
    private static final long serialVersionUID = 1L;
    private Float valor;
    private TurmaDao turmaDao = new TurmaDao();
    private unidadeTipologiaDao unidadeTipologiaDao = new unidadeTipologiaDao();
    
    public Float getValor(Professor professor, Unidade unidade, Turma turma, Date horaIni, Date horaFim) {
       
        Turma resultado; 
        ProfessorUnidadeTipologia resultado2;
        
        SimpleDateFormat hr = new SimpleDateFormat("HH:mm");   
        String pattern = "HH:mm";  

        DateFormat df = new SimpleDateFormat(pattern);        
        
        String dStart = "01/01/2013 " + df.format(horaIni);
        String dStop = "01/01/2013 " + df.format(horaFim);

        SimpleDateFormat fmt = new SimpleDateFormat("MM/dd/yyyy HH:mm");

        Date d1 = null;
        Date d2 = null;

        try{
            d1 = fmt.parse(dStart);
            d2 = fmt.parse(dStop);

            float difference = d2.getTime() - d1.getTime();
            float hours = difference / (60 * 60 * 1000) % 24;
        
            System.out.println("total em horas : " + hours);
                         
            valor = hours;                                               
         
           try{
             resultado = turmaDao.getById(turma.getId());
             
             Integer formaCalc = resultado.getFormaCalc();
             Float valTurma = resultado.getValor().floatValue();
                     
             System.out.println("forma de calculo: " + formaCalc);
             System.out.println("valor : " + valTurma);
             
             if (formaCalc == 1) {  // Padrão
                 
                 System.out.println("Calculo Padrão");                 
                 
                     resultado2 = unidadeTipologiaDao.consultaTipologiaProfessor(professor.getId(), unidade);
             
                     Float valTipologia = resultado2.getTipologia().getValor().floatValue();
                     
                     System.out.println("valor tipologia : " + valTipologia);
            
                     valor = hours * valTipologia;
                                          
             }
             
             if (formaCalc == 2) {  // Percentual
                 
                 System.out.println("Calculo por Percentual");
                 
                     resultado2 = unidadeTipologiaDao.consultaTipologiaProfessor(professor.getId(), unidade);
                  
                     Float valTipologia = resultado2.getTipologia().getValor().floatValue();
                     
                     System.out.println("valor tipologia : " + valTipologia);
                    
                     valor = hours * valTipologia * (valTurma / 100);  
                    
             }
             
             if (formaCalc == 3) {  // Valor Fixo 
                 
                 System.out.println("Calculo Valor Fixo");
                 
                 valor = hours * valTurma;
                     
             }
             
            }catch(NoResultException e){
              System.out.println("Erro1: " + e);
            }
         
        } catch (Exception e) {
         System.out.println("Erro2: " + e);
        }
                        
        return valor;
    } 
    
    public Float getValorHoras(Professor professor, Unidade unidade, Turma turma, Float hours) {
       
        Turma resultado; 
        ProfessorUnidadeTipologia resultado2;        

        Date d1 = null;
        Date d2 = null;

        try{                    
                         
            valor = hours;                                               
         
           try{
             resultado = turmaDao.getById(turma.getId());
             
             Integer formaCalc = resultado.getFormaCalc();
             Float valTurma = resultado.getValor().floatValue();
             
             if (formaCalc == 1) {  // Padrão
                 
                 System.out.println("Calculo Padrão");                 
                 
                     resultado2 = unidadeTipologiaDao.consultaTipologiaProfessor(professor.getId(), unidade);
             
                     Float valTipologia = resultado2.getTipologia().getValor().floatValue();                                          
            
                     valor = hours * valTipologia;
                                          
             }
             
             if (formaCalc == 2) {  // Percentual
                 
                 System.out.println("Calculo por Percentual");
                 
                     resultado2 = unidadeTipologiaDao.consultaTipologiaProfessor(professor.getId(), unidade);
                  
                     Float valTipologia = resultado2.getTipologia().getValor().floatValue();
                     
                     System.out.println("valor tipologia : " + valTipologia);
                     
                     valor = hours * valTipologia * (valTurma / 100);  
                    
             }
             
             if (formaCalc == 3) {  // Valor Fixo 
                 
                 System.out.println("Calculo Valor Fixo");
                 
                 valor = hours * valTurma;
                     
             }
             
            }catch(NoResultException e){
              System.out.println("Erro1: " + e);
            }
         
        } catch (Exception e) {
         System.out.println("Erro2: " + e);
        }
        System.out.println("Valor calculado :"+valor);
        return valor;
    } 
    
    public Float getTempo(Date horaIni, Date horaFim) {
               
        SimpleDateFormat hr = new SimpleDateFormat("HH:mm");   
        String pattern = "HH:mm";  

        DateFormat df = new SimpleDateFormat(pattern);        
        
        String dStart = "01/01/2013 " + df.format(horaIni);
        String dStop = "01/01/2013 " + df.format(horaFim);

        SimpleDateFormat fmt = new SimpleDateFormat("MM/dd/yyyy HH:mm");

        Date d1 = null;
        Date d2 = null;

        try{
            d1 = fmt.parse(dStart);
            d2 = fmt.parse(dStop);

            float difference = d2.getTime() - d1.getTime();
            float hours = difference / (60 * 60 * 1000) % 24;                     
                         
            valor = hours;                                                        
         
	        } catch (Exception e) {
	         System.out.println("Erro: " + e.getMessage());
	        }
        System.out.println("getTempo :"+valor);
        return valor;
    }        
    
    public Float getValorReceber(Integer professor, Unidade unidade, Float hours) {
               
        ProfessorUnidadeTipologia retornoUnidadeTipologia;                                              
        
           try{                                            
                 
                 retornoUnidadeTipologia = unidadeTipologiaDao.consultaTipologiaProfessor(professor, unidade);
                 
                 Float valTipologia = retornoUnidadeTipologia.getTipologia().getValor().floatValue();

                 valor = hours * valTipologia;                                          
             
            }catch(NoResultException e){
              System.out.println("Erro1: " + e);
            }
                        
        return valor;
    }
    
    public Float horasAvulsas(Date horaIniAula, Date horaFimAula, Date horaIniDispo, Date horaFimDispo){
        
        Float horas = 0F;
        
        if(horaIniAula.before(horaIniDispo)){
            
            horas = horas + getTempo(horaIniAula, horaIniDispo);
            
        }
        
        if(horaFimAula.after(horaFimDispo)){
            
            horas = horas + getTempo(horaFimAula, horaFimDispo);
            
        }
        
        if(horas < 0){
            
            horas = horas * (-1);
            
        }
        
        System.out.println("Horas casadas :"+horas);
        
        return horas;
        
    }
    
}